#include <QApplication>     // Qt应用程序核心类
#include <QMainWindow>      // 主窗口类，带菜单栏、状态栏等
#include <QMdiArea>         // 多文档界面（MDI）区域控件
#include <QMdiSubWindow>    // MDI子窗口
#include <QTextEdit>        // 多行文本编辑控件
#include <QMenuBar>         // 菜单栏
#include <QStatusBar>       // 状态栏
#include <QAction>          // 菜单动作
#include <QLabel>           // 标签控件，用于显示文本

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);  // 创建应用程序对象，管理应用的生命周期

    QMainWindow mainWindow;        // 创建主窗口
    mainWindow.setWindowTitle("高级 QMdiArea 示例");  // 设置窗口标题

    // 创建多文档区域控件，并设置为主窗口的中央控件
    QMdiArea *mdiArea = new QMdiArea();
    mainWindow.setCentralWidget(mdiArea);

    // 创建状态栏标签，用于显示当前打开的子窗口数量
    QLabel *statusLabel = new QLabel("打开窗口数：0");
    mainWindow.statusBar()->addPermanentWidget(statusLabel);  // 将标签固定显示在状态栏右侧

    // 创建菜单栏里的“文件”菜单和相关动作
    QMenu *fileMenu = mainWindow.menuBar()->addMenu("文件");
    QAction *newAction = fileMenu->addAction("新建");              // 新建子窗口动作
    QAction *closeAction = fileMenu->addAction("关闭当前窗口");     // 关闭当前激活子窗口动作
    QAction *closeAllAction = fileMenu->addAction("关闭所有窗口");   // 关闭所有子窗口动作

    // 创建菜单栏里的“窗口”菜单和相关动作
    QMenu *windowMenu = mainWindow.menuBar()->addMenu("窗口");
    QAction *tileAction = windowMenu->addAction("平铺");          // 平铺所有子窗口
    QAction *cascadeAction = windowMenu->addAction("层叠");        // 层叠所有子窗口

    // 定义一个 lambda 函数，用于更新状态栏显示的打开窗口数量
    auto updateWindowCount = [mdiArea, statusLabel]() {
        int count = mdiArea->subWindowList().count();             // 获取当前打开的子窗口数量
        statusLabel->setText(QString("打开窗口数：%1").arg(count)); // 更新状态栏标签内容
    };

    // 新建子窗口动作的槽函数，创建 QTextEdit 子窗口并显示
    QObject::connect(newAction, &QAction::triggered, [&]() {
        QTextEdit *textEdit = new QTextEdit;                       // 新建文本编辑控件
        QMdiSubWindow *subWindow = mdiArea->addSubWindow(textEdit);// 将文本编辑控件包裹进 MDI 子窗口
        subWindow->setWindowTitle(QString("文档 %1").arg(mdiArea->subWindowList().size())); // 设置子窗口标题
        subWindow->show();                                          // 显示子窗口
        updateWindowCount();                                        // 更新状态栏中的打开窗口数
    });

    // 关闭当前激活子窗口动作的槽函数
    QObject::connect(closeAction, &QAction::triggered, [&]() {
        if (QMdiSubWindow *activeSubWindow = mdiArea->activeSubWindow()) {
            activeSubWindow->close();                               // 关闭当前激活的子窗口
        }
    });

    // 关闭所有子窗口动作，直接调用 QMdiArea 提供的关闭全部子窗口函数
    QObject::connect(closeAllAction, &QAction::triggered, mdiArea, &QMdiArea::closeAllSubWindows);

    // 平铺所有子窗口动作
    QObject::connect(tileAction, &QAction::triggered, mdiArea, &QMdiArea::tileSubWindows);

    // 层叠所有子窗口动作
    QObject::connect(cascadeAction, &QAction::triggered, mdiArea, &QMdiArea::cascadeSubWindows);

    // 监听子窗口激活信号，当切换激活子窗口时，更新打开窗口数显示
    QObject::connect(mdiArea, &QMdiArea::subWindowActivated, [&]() {
        updateWindowCount();
    });

    mainWindow.resize(900, 700);  // 设置主窗口初始大小
    mainWindow.show();             // 显示主窗口

    return app.exec();             // 进入应用程序事件循环
}
